<?php

class dbManager {
  /**
     Clase encargada de manejar conexiones con la base de datos
     y de crear cursores para ejecutar instrucciones.
   */

  // Atributos
  protected $uname;
  protected $passwd;
  protected $host;
  protected $base;
  private $cnx;

  function __construct() {
    /*
      Lee la informacion de settings.ini e inicializa sus
      propios atributos con dicha informacion.
     */
    $db_data = parse_ini_file("../../settings.ini");

    $this->uname = $db_data['DB_USERNAME'];
    $this->passwd = $db_data['DB_PASSWORD'];
    $this->host = $db_data['DB_HOSTNAME'];
    $this->base = $db_data['DB_NAME'];
  }

  public function conectar() {
    /*
      Se conecta a la base de datos.

      To-do: Asegurarse bien de todos los errores que puedan haber en el
      proceso de conexion con la base de datos y tratar de informarlos
      de forma elegante.
     */
    if (!($this->cnx = mysql_connect($this->host, $this->uname, $this->passwd))) {
      die(mysql_error());
    }
    $dbs = mysql_select_db($this->base, $this->cnx);

    if (!is_resource($this->cnx)) {
      $message = 'Fallo en la conexion de la base de datos,';
      $message .= mysql_error() . "\n";
      die($message);
    }

    return array($this->cnx, $dbs);
  }

  public function crearCursor() {
    /*
      Crea y devuelve un objeto cursor para ejecutar querys.
     */
    return new dbCursor($this->cnx);
  }

  public function desconectar() {
    /*
      Desconecta de la base de datos.
     */
    mysql_close($this->cnx);
  }

}

class dbCursor {
  protected $handler;
  public $result_set;

  function __construct($h) {
    $this->handler = $h;
  }

  public function execute($query) {
    /*
      Ejecuta un query y guarda el resultado en el atributo
      'result_set'. Si algo falla reporta el error y muere.
     */
    $this->result_set = mysql_query($query, $this->handler);
    if (!$this->result_set) {
      $message = 'Invalid query: '.mysql_error()."\n";
      $message .= 'Whole query: '.$query."\n";
      die ($message);
    }
    return $this->result_set;
  }

  public function fetchOne($class_name = '') {
    /*
      Obtiene la tupla del result_set en donde esta parado
      actualmente el cursor y lo devuelve como un objeto
      del tipo $class_name o stdClass
     */
    if ($class_name == '')
      return mysql_fetch_object($this->result_set);
    else

      return mysql_fetch_object($this->result_set, $class_name);
  }

  public function count() {
    /*
      Obtiene el numero de resultados en 'result_set'
     */
    return mysql_num_rows($this->result_set);
  }

  public function fetchAllInArray($class_name = '') {
    /*
      fetchAllInArray: Devuelve un arreglo con todas las instancias
      del 'result_set'
     */
    $arr = array();
    while($inst = $this->fetchOne($class_name))
      array_push($arr, $inst);
    return $arr;
  }

  public function fetchOneArray() {
    /*
      Obtiene la tupla del result_set en donde esta parado
      actualmente el cursor y la devuelve como un arreglo
      asociativo.
     */
    return mysql_fetch_array($this->result_set);
  }

  public function getHandler() {
    /*
      Devuelve el manejador actual del cursor
     */
    return $this->handler;
  }

  public function __destruct() {
    /*
      A la hora de morir, libera todos resultados si los hay
     */
    @mysql_free_result($this->result_set);
  }
}

?>